export class DateUtils {
    /**
     * 获取当前日期的字符串表示，格式为 yyyy-MM-dd
     * @param date 可选的 Date 对象，默认为当前日期
     */
    static formatDate(date: Date = new Date()): string {
        const year = date.getFullYear();
        const month = String(date.getMonth() + 1).padStart(2, '0');  // 月份是从 0 开始的
        const day = String(date.getDate()).padStart(2, '0');
        return `${year}-${month}-${day}`;
    }

    /**
     * 日期偏移，返回偏移后的日期
     * @param date 原始日期
     * @param offset 偏移天数，可以是负数
     */
    static offsetDays(date: Date, offset: number): Date {
        const result = new Date(date);
        result.setDate(result.getDate() + offset);
        return result;
    }

    /**
     * 月份偏移，返回偏移后的日期
     * @param date 原始日期
     * @param offset 偏移月份数，可以是负数
     */
    static offsetMonths(date: Date, offset: number): Date {
        const result = new Date(date);
        result.setMonth(result.getMonth() + offset);
        return result;
    }

    /**
     * 年份偏移，返回偏移后的日期
     * @param date 原始日期
     * @param offset 偏移年份数，可以是负数
     */
    static offsetYears(date: Date, offset: number): Date {
        const result = new Date(date);
        result.setFullYear(result.getFullYear() + offset);
        return result;
    }

    /**
     * 获取日期所在月的第一天
     * @param date 给定的日期
     */
    static getFirstDayOfMonth(date: Date): Date {
        const result = new Date(date);
        result.setDate(1);
        return result;
    }

    /**
     * 获取日期所在月的最后一天
     * @param date 给定的日期
     */
    static getLastDayOfMonth(date: Date): Date {
        const result = new Date(date);
        result.setMonth(result.getMonth() + 1);
        result.setDate(0);  // 设置为下个月的第一天减去一天，即为当月的最后一天
        return result;
    }

    /**
     * 判断是否是闰年
     * @param year 年份
     */
    static isLeapYear(year: number): boolean {
        return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);
    }

    /**
     * 获取月份的天数
     * @param date 日期
     */
    static getDaysInMonth(date: Date): number {
        const year = date.getFullYear();
        const month = date.getMonth();
        return new Date(year, month + 1, 0).getDate();
    }

    /**
     * 比较两个日期是否相同
     * @param date1 第一个日期
     * @param date2 第二个日期
     */
    static isSameDate(date1: Date, date2: Date): boolean {
        return date1.getFullYear() === date2.getFullYear() &&
            date1.getMonth() === date2.getMonth() &&
            date1.getDate() === date2.getDate();
    }

    /**
     * 获取两个日期之间的天数差
     * @param date1 第一个日期
     * @param date2 第二个日期
     */
    static getDaysDifference(date1: Date, date2: Date): number {
        const timeDiff = Math.abs(date2.getTime() - date1.getTime());
        return Math.floor(timeDiff / (1000 * 3600 * 24));
    }
}
